package com.init.resolvers;

import javax.annotation.Resource;

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import com.dao.UserDao;
import com.entity.User;


/**
 * @auth:zxl
 * @date:2018年3月1日
 * @desc:增加方法注入，将含有CurrentUser注解的方法参数注入当前登录用户
 */
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
	
	@Resource
	private UserDao userDao;
	
	public CurrentUserMethodArgumentResolver() {
	    System.out.println("Ready");
	}
	
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		//如果参数类型是UserToken并且有注解CurrentUser则支持
        if (parameter.getParameterType().isAssignableFrom(UserToken.class) &&
                parameter.hasParameterAnnotation(CurrentUser.class)) {
            return true;
        }
        return false;
	}
	
	/**
	① webRequest.getParameter：访问请求参数区的数据，可以通过getHeader()访问请求头数据；
	② webRequest.setAttribute/getAttribute：到指定的作用范围内取/放属性数据，Servlet定义的三个作用范围分别使用如下常量代表：
				SCOPE_REQUEST ：代表请求作用范围；
				SCOPE_SESSION ：代表会话作用范围；
				SCOPE_GLOBAL_SESSION ：代表全局会话作用范围，即ServletContext上下文作用范围。 
	③ nativeWebRequest.getNativeRequest/nativeWebRequest.getNativeResponse：得到本地的Servlet API
	*/
	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
			WebDataBinderFactory binderFactory) throws Exception {
		// TODO 取出鉴权时存入的登录用户Id
		if(null != webRequest.getParameter("id")){
			Integer currentUserId = Integer.parseInt(webRequest.getParameter("id"));
			if (null != currentUserId) {
				//从数据库中查询并返回
				User user = userDao.getById(currentUserId);
				if(null != user){
					UserToken userToken=new UserToken();
					userToken.setName(user.getName());
					userToken.setPassword(user.getPassword());
					userToken.setAge(user.getAge());
					userToken.setDept_id(user.getDept_id());
					userToken.setStatus(user.getStatus());
					userToken.setUsername(user.getUsername());
					return userToken;
				}
			}
		}
        return null;
	}

}
